/*
 * Copyright (c) 2007, Laminar Research.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 *
 */

#include "GISTool_CoreCmds.h"
#include "GISTool_Utils.h"
#include "GISTool_Globals.h"
#include "MapTopology.h"
#include "MapOverlay.h"
#include "PerfUtils.h"
#include "AptAlgs.h"
#include "MeshDefs.h"
#include "MapAlgs.h"
#include "AptIO.h"
#include "DEMDefs.h"
#include "FileUtils.h"
#include "EnumSystem.h"
#include "FAA_Obs.h"
#include "XESIO.h"
#include "MemFileUtils.h"
#include "GISUtils.h"
#include "XESInit.h"

#if OPENGL_MAP
#include "RF_Notify.h"
#include "RF_Msgs.h"
#endif

static int DoExtent(const vector<const char *>& args)
{
	gMapWest = atoi(args[0]);
	gMapSouth = atoi(args[1]);
	gMapEast = atoi(args[2]);
	gMapNorth = atoi(args[3]);
	if (gMapWest >= gMapEast ||
		gMapSouth >= gMapNorth ||
		 gMapWest < -180.0 ||
		 gMapEast > 180.0 ||
		 gMapSouth < -90.0 ||
		 gMapNorth > 90.0)
	{
		if (gVerbose)
			printf("Error: illegal bounds %d,%d -> %d, %d\n",
				gMapWest, gMapSouth, gMapEast, gMapNorth);
		return 1;
	}
	return 0;
}

static int DoBbox(const vector<const char *>& args)
{
	Point_2	sw, ne;
	CalcBoundingBox(gMap, sw, ne);
	printf("SW = %lf,%lf  NE = %lf, %lf\n", CGAL::to_double(sw.x()), CGAL::to_double(sw.y()), CGAL::to_double(ne.x()), CGAL::to_double(ne.y()));

	for (DEMGeoMap::iterator i = gDem.begin(); i != gDem.end(); ++i)
	{
		printf("DEM %s: SW = %lfx%lf, NE = %lfx%lf, %d by %d (%c)\n",
			FetchTokenString(i->first),
			i->second.mWest, i->second.mSouth, i->second.mEast, i->second.mNorth, i->second.mWidth, i->second.mHeight, i->second.mPost ? 'P' : 'A');
	}
	if (!gFAAObs.empty())
	{
		double	obs_lat_min =   90.0;
		double	obs_lat_max =  -90.0;
		double	obs_lon_min =  180.0;
		double	obs_lon_max = -180.0;
		for (FAAObsTable::iterator i = gFAAObs.begin(); i != gFAAObs.end(); ++i)
		{
			obs_lat_min = min(obs_lat_min, i->second.lat);
			obs_lat_max = max(obs_lat_max, i->second.lat);
			obs_lon_min = min(obs_lon_min, i->second.lon);
			obs_lon_max = max(obs_lon_max, i->second.lon);
		}
		printf("Bounds for all objects are: %lf,%lf -> %lf, %lf\n",
			obs_lon_min, obs_lon_max, obs_lat_min, obs_lat_max);
	}
	return 0;
}

/*
static int DoNearest(const vector<const char *>& args)
{
	Point2	p1, p2;
	double dist = gMap.smallest_dist(p1, p2);
	double	dist_m = dist * DEG_TO_NM_LAT * NM_TO_MTR;
	printf("Smallest dist is: %lf meters\n", dist_m);
	printf("From %lf,%lf to %lf, %lf\n", p1.x, p1.y, p2.x, p2.y);
	return 1;
}
*/

static int DoWaterCount(const vector<const char *>& args)
{
	double total = 0.0;
	for (Pmwx::Face_iterator face = gMap.faces_begin(); face != gMap.faces_end(); ++face)
	if (!face->is_unbounded())
	if (face->data().IsWater())
	{
		Pmwx::Ccb_halfedge_circulator circ, stop;
		circ = stop = face->outer_ccb();
		do {
			total += CGAL::to_double(Vector_2(stop->source()->point(), circ->source()->point()) *
					  Vector_2(stop->source()->point(), circ->target()->point()).perpendicular(CGAL::COUNTERCLOCKWISE));
			++circ;
		} while (circ != stop);

		for (Pmwx::Hole_iterator hole = face->holes_begin(); hole != face->holes_end(); ++hole)
		{
			circ = stop = *hole;
			do {
				total += CGAL::to_double(Vector_2(stop->source()->point(), circ->source()->point()) *
						  Vector_2(stop->source()->point(), circ->target()->point()).perpendicular(CGAL::COUNTERCLOCKWISE));
				++circ;
			} while (circ != stop);
		}
	}
	printf("TOTAL WATER AREA = %lf\n", total);
	return 1;
}

static int DoCropGrid(const vector<const char *>& args)
{
	gMap.unbounded_face()->data().mTerrainType = terrain_Natural;

	CGAL::insert(gMap,Curve_2(Segment_2(Point_2(gMapWest,gMapSouth),Point_2(gMapEast,gMapSouth))));
	CGAL::insert(gMap,Curve_2(Segment_2(Point_2(gMapWest,gMapNorth),Point_2(gMapEast,gMapNorth))));
	CGAL::insert(gMap,Curve_2(Segment_2(Point_2(gMapWest,gMapSouth),Point_2(gMapWest,gMapNorth))));
	CGAL::insert(gMap,Curve_2(Segment_2(Point_2(gMapEast,gMapSouth),Point_2(gMapEast,gMapNorth))));

//	for (int x = sw.x; x <= ne.x; ++x)
//	{
//		gMap.insert_edge(Point2(x,sw.y),Point2(x,ne.y), NULL, NULL);
//	}
//	for (int y = sw.y; y <= ne.y; ++y)
//	{
//		gMap.insert_edge(Point2(sw.x,y),Point2(ne.x,y), NULL, NULL);
//	}
	return 0;
}

static int DoCrop(const vector<const char *>& args)
{
	if (gMap.number_of_halfedges() > 0)
		CropMap(gMap, gMapWest, gMapSouth, gMapEast, gMapNorth, false, gProgress);

	printf("Map contains: %llu faces, %llu half edges, %llu vertices.\n",
		(unsigned long long)gMap.number_of_faces(),
		(unsigned long long)gMap.number_of_halfedges(),
		(unsigned long long)gMap.number_of_vertices());

	set<int>	nukable;
	for (DEMGeoMap::iterator i = gDem.begin(); i != gDem.end(); ++i)
	{
		if (i->second.mWest > gMapEast ||
			i->second.mEast < gMapWest ||
			i->second.mSouth > gMapNorth ||
			i->second.mNorth < gMapSouth)
		{
			nukable.insert(i->first);
		} else {
			if (i->second.mWest < gMapWest ||
				i->second.mEast > gMapEast ||
				i->second.mSouth < gMapSouth ||
				i->second.mNorth > gMapNorth)
			{
				DEMGeo	croppy;
				i->second.subset(croppy,
								 i->second.x_lower(gMapWest),
								 i->second.y_lower(gMapSouth),
								 i->second.x_upper(gMapEast),
								 i->second.y_upper(gMapNorth));
				i->second = croppy;
			}
		}
	}

	for(set<int>::iterator q = nukable.begin(); q != nukable.end(); ++q)
		gDem.erase(*q);

	if (!gFAAObs.empty())
	{
		FAAObsTable::iterator i, n;
		for (i = gFAAObs.begin(); i != gFAAObs.end(); )
		{
			n = i;
			++n;
			if (i->second.lon < gMapWest ||
				i->second.lat < gMapSouth ||
				i->second.lon > gMapEast ||
				i->second.lat > gMapNorth)
			{
				gFAAObs.erase(i);
			}
			i = n;
		}
	}
	return 0;
}

static int DoValidate(const vector<const char *>& args)
{
	bool	is_valid = gMap.is_valid();
	if (gVerbose)
		printf("Map %s valid.\n", is_valid ? "is" : "is not");
	if (!is_valid)
	{
		fprintf(stderr,"Validation check failed for map %d,%d -> %d,%d\n", gMapWest, gMapSouth, gMapEast, gMapNorth);
		return 1;
	}
	return 0;
}

static int DoLoad(const vector<const char *>& args)
{
	if (gVerbose) printf("Loading file %s...\n", args[0]);
	MFMemFile * load = MemFile_Open(args[0]);
	if (load)
	{
		ReadXESFile(load, &gMap, &gTriangulationHi, &gDem, &gApts, gProgress);
		IndexAirports(gApts, gAptIndex);
		MemFile_Close(load);

	} else {
		fprintf(stderr,"Could not load file %s.\n", args[0]);
		return 1;
	}
	if (gVerbose)
			printf("Map contains: %llu faces, %llu half edges, %llu vertices.\n",
				(unsigned long long)gMap.number_of_faces(),
				(unsigned long long)gMap.number_of_halfedges(),
				(unsigned long long)gMap.number_of_vertices());

#if OPENGL_MAP
	RF_Notifiable::Notify(rf_Cat_File, rf_Msg_FileLoaded, NULL);
#endif
	return 0;
}

static int DoOverlay(const vector<const char *>& args)
{
	if (gVerbose) printf("Overlaying file %s...\n", args[0]);
	MFMemFile * load = MemFile_Open(args[0]);
	Pmwx		theMap;
	if (load)
	{
		ReadXESFile(load, &theMap, NULL, NULL, NULL, gProgress);
		MemFile_Close(load);

	} else {
		fprintf(stderr,"Could not load file.\n");
		return 1;
	}
	if (gVerbose)
			printf("Map contains: %llu faces, %llu half edges, %llu vertices.\n",
				(unsigned long long)theMap.number_of_faces(),
				(unsigned long long)theMap.number_of_halfedges(),
				(unsigned long long)theMap.number_of_vertices());

	RemoveUnboundedWater(theMap);
	if (gVerbose)
			printf("Without Water Map contains: %llu faces, %llu half edges, %llu vertices.\n",
				(unsigned long long)theMap.number_of_faces(),
				(unsigned long long)theMap.number_of_halfedges(),
				(unsigned long long)theMap.number_of_vertices());

	OverlayMap_legacy(gMap, theMap);
	if (gVerbose)
			printf("Merged Map contains: %llu faces, %llu half edges, %llu vertices.\n",
				(unsigned long long)gMap.number_of_faces(),
				(unsigned long long)gMap.number_of_halfedges(),
				(unsigned long long)gMap.number_of_vertices());
	return 0;
}

static int DoMerge(const vector<const char *>& args)
{
	if (gVerbose) printf("Merging file %s...\n", args[0]);
	MFMemFile * load = MemFile_Open(args[0]);
	Pmwx		theMap;
	if (load)
	{
		ReadXESFile(load, &theMap, NULL, NULL, NULL, gProgress);
		MemFile_Close(load);

	} else {
		fprintf(stderr,"Could not load file.\n");
		return 1;
	}
	if (gVerbose)
			printf("Map contains: %llu faces, %llu half edges, %llu vertices.\n",
				(unsigned long long)theMap.number_of_faces(),
				(unsigned long long)theMap.number_of_halfedges(),
				(unsigned long long)theMap.number_of_vertices());

//	TopoIntegrateMaps(&gMap, &theMap);
	MergeMaps_legacy(gMap, theMap, false, NULL, true, gProgress);
	if (gVerbose)
			printf("Merged Map contains: %llu faces, %llu half edges, %llu vertices.\n",
				(unsigned long long)gMap.number_of_faces(),
				(unsigned long long)gMap.number_of_halfedges(),
				(unsigned long long)gMap.number_of_vertices());
	return 0;
}



static int DoSave(const vector<const char *>& args)
{
	int nland = 0;
	for(Pmwx::Face_iterator f = gMap.faces_begin(); f != gMap.faces_end(); ++f)
	if(!f->is_unbounded())
	{
		if (!f->data().IsWater())
			++nland;
		if (nland > 0)
			break;
	}
	if (/*!gDem.empty() || */(nland > 0) || distance(gMap.unbounded_face()->holes_begin(),gMap.unbounded_face()->holes_end()) > 1)
	{
		if (gVerbose) printf("Saving file %s\n", args[0]);
		WriteXESFile(args[0], gMap, gTriangulationHi, gDem, gApts, gProgress);
		return 0;
	} else {
		printf("Not writing file %s - no DEMs and no land!\n", args[0]);
		fprintf(stderr, "Not writing file %s - no DEMs and no land!\n", args[0]);
		return 1;
	}
}

static int DoSaveForce(const vector<const char *>& args)
{
	if (gVerbose) printf("Saving file %s (always)\n", args[0]);
	WriteXESFile(args[0], gMap, gTriangulationHi, gDem, gApts, gProgress);
	return 0;
}


static int DoIfEmpty(const vector<const char *>& args)
{
	if(args.size() == 1)
	{
		int nland = 0;
		for(Pmwx::Face_iterator f = gMap.faces_begin(); f != gMap.faces_end(); ++f)
		if(!f->is_unbounded())
		{
			if (!f->data().IsWater())
				++nland;
			if (nland > 0)
				break;
		}
		if(nland > 0)
			GISTool_SetSkip(atoi(args[0]));
	}
	else 
	{
		int token = LookupToken(args[1]);
		if(token == -1)
			return 1;
		if(gDem.count(token) == 0)					// No dem - by definition empty.
			return 0;
		DEMGeo& l(gDem[token]);
		
		for(int y=0;y<l.mHeight;++y)
		for(int x=0;x<l.mWidth;++x)
		if(l.get(x,y) != DEM_NO_DATA)
		{
			GISTool_SetSkip(atoi(args[0]));		
			return 0;
		}		
	}
	return 0;
}




static int DoCropSave(const vector<const char *>& args)
{
	Point_2	sw, ne;
	CalcBoundingBox(gMap, sw, ne);


	for (int w = CGAL::to_double(sw.x()); w < CGAL::to_double(ne.x()); ++w)
	for (int s = CGAL::to_double(sw.y()); s < CGAL::to_double(ne.y()); ++s)
	{
		vector<Point_2>	pts;
		pts.push_back(Point_2(w  ,s  ));
		pts.push_back(Point_2(w+1,s  ));
		pts.push_back(Point_2(w+1,s+1));
		pts.push_back(Point_2(w  ,s+1));

		Pmwx	cutout;
		CropMap(gMap, cutout, pts, gProgress);

		SimplifyMap(cutout, false, gProgress);

		int nland = 0;
		for (Pmwx::Face_iterator f = cutout.faces_begin(); f != cutout.faces_end(); ++f)
		{
			if (!f->data().IsWater())
				++nland;
			if (nland > 0)
				break;
		}
		if (nland > 0)
		{
			char	fbuf[1024];
			sprintf(fbuf,"%s%+03d%+04d/", args[0], latlon_bucket(s), latlon_bucket(w));
			FILE_make_dir_exist(fbuf);
			sprintf(fbuf,"%s%+03d%+04d/%+03d%+04d.xes", args[0], latlon_bucket(s), latlon_bucket(w), s, w);
			if (gVerbose) printf("Saving file %s\n", fbuf);
			DEMGeoMap	dem;
			AptVector	apt;
			CDT			mesh;
			WriteXESFile(fbuf, cutout, mesh, dem, apt, gProgress);
		} else {
			printf("Not writing file %s - no DEMs and no land!\n", args[0]);
			fprintf(stderr, "Not writing file %s - no DEMs and no land!\n", args[0]);
		}
	}
	return 0;
}

static int DoTagOrigin(const vector<const char *>& args)
{
	float o = atof(args[0]);
	for(Pmwx::Face_iterator f = gMap.faces_begin(); f != gMap.faces_end(); ++f)
		f->data().mParams[af_OriginCode] = o;
	if (gVerbose)
		printf("Set %llu faces to have origin ode %f\n",(unsigned long long)gMap.number_of_faces(), o);
	return 0;
}

static int DoSimplify(const vector<const char *>& args)
{
	if (gVerbose)
		printf("Halfedges before simplify: %llu\n", (unsigned long long)gMap.number_of_halfedges());
	SimplifyMap(gMap, false, gProgress);
	if (gVerbose)
		printf("Halfedges after simplify: %llu\n", (unsigned long long)gMap.number_of_halfedges());
	return 0;
}

static const char * eu_latlon[] = {
"+26-017",
"+27-018",
"+27-017",
"+27-016",
"+28-019",
"+28-018",
"+28-017",
"+28-016",
"+28-015",
"+29-020",
"+29-019",
"+29-018",
"+29-017",
"+29-016",
"+29-015",
"+29-014",
"+30-020",
"+30-019",
"+30-018",
"+30-017",
"+30-016",
"+30-015",
"+30-014",
"+31-021",
"+31-020",
"+31-019",
"+31-018",
"+31-017",
"+31-016",
"+31-015",
"+31-014",
"+31-013",
"+32-021",
"+32-020",
"+32-019",
"+32-018",
"+32-017",
"+32-016",
"+32-015",
"+32-014",
"+32-013",
"+33-022",
"+33-021",
"+33-020",
"+33-019",
"+33-018",
"+33-017",
"+33-016",
"+33-015",
"+33-014",
"+33-013",
"+33-012",
"+33+023",
"+33+024",
"+33+025",
"+33+026",
"+33+027",
"+33+028",
"+33+029",
"+33+030",
"+33+031",
"+33+032",
"+33+033",
"+33+034",
"+33+035",
"+33+036",
"+34-022",
"+34-021",
"+34-020",
"+34-019",
"+34-018",
"+34-017",
"+34-016",
"+34-015",
"+34-014",
"+34-013",
"+34-012",
"+34-011",
"+34+011",
"+34+012",
"+34+013",
"+34+014",
"+34+015",
"+34+016",
"+34+017",
"+34+018",
"+34+019",
"+34+020",
"+34+021",
"+34+022",
"+34+023",
"+34+024",
"+34+025",
"+34+026",
"+34+027",
"+34+028",
"+34+029",
"+34+030",
"+34+031",
"+34+032",
"+34+033",
"+34+034",
"+34+035",
"+34+036",
"+34+037",
"+35-033",
"+35-032",
"+35-031",
"+35-030",
"+35-029",
"+35-028",
"+35-027",
"+35-026",
"+35-025",
"+35-024",
"+35-014",
"+35-013",
"+35-012",
"+35-011",
"+35-010",
"+35+011",
"+35+012",
"+35+013",
"+35+014",
"+35+015",
"+35+016",
"+35+017",
"+35+018",
"+35+019",
"+35+020",
"+35+021",
"+35+022",
"+35+023",
"+35+024",
"+35+025",
"+35+026",
"+35+027",
"+35+028",
"+35+029",
"+35+030",
"+35+031",
"+35+032",
"+35+033",
"+35+034",
"+35+035",
"+35+036",
"+35+037",
"+36-033",
"+36-032",
"+36-031",
"+36-030",
"+36-029",
"+36-028",
"+36-027",
"+36-026",
"+36-025",
"+36-024",
"+36-014",
"+36-013",
"+36-012",
"+36-011",
"+36-010",
"+36-009",
"+36-008",
"+36-007",
"+36-006",
"+36-005",
"+36-004",
"+36-003",
"+36+011",
"+36+012",
"+36+013",
"+36+014",
"+36+015",
"+36+016",
"+36+017",
"+36+018",
"+36+019",
"+36+020",
"+36+021",
"+36+022",
"+36+023",
"+36+024",
"+36+025",
"+36+026",
"+36+027",
"+36+028",
"+36+029",
"+36+030",
"+36+031",
"+36+032",
"+36+033",
"+36+034",
"+36+035",
"+36+036",
"+36+037",
"+36+038",
"+36+039",
"+36+040",
"+36+041",
"+37-033",
"+37-032",
"+37-031",
"+37-030",
"+37-029",
"+37-028",
"+37-027",
"+37-026",
"+37-025",
"+37-024",
"+37-014",
"+37-013",
"+37-012",
"+37-011",
"+37-010",
"+37-009",
"+37-008",
"+37-007",
"+37-006",
"+37-005",
"+37-004",
"+37-003",
"+37-002",
"+37-001",
"+37+000",
"+37+011",
"+37+012",
"+37+013",
"+37+014",
"+37+015",
"+37+016",
"+37+017",
"+37+018",
"+37+019",
"+37+020",
"+37+021",
"+37+022",
"+37+023",
"+37+024",
"+37+025",
"+37+026",
"+37+027",
"+37+028",
"+37+029",
"+37+030",
"+37+031",
"+37+032",
"+37+033",
"+37+034",
"+37+035",
"+37+036",
"+37+037",
"+37+038",
"+37+039",
"+37+040",
"+37+041",
"+38-033",
"+38-032",
"+38-031",
"+38-030",
"+38-029",
"+38-028",
"+38-027",
"+38-026",
"+38-025",
"+38-024",
"+38-014",
"+38-013",
"+38-012",
"+38-011",
"+38-010",
"+38-009",
"+38-008",
"+38-007",
"+38-006",
"+38-005",
"+38-004",
"+38-003",
"+38-002",
"+38-001",
"+38+000",
"+38+001",
"+38+002",
"+38+003",
"+38+004",
"+38+005",
"+38+006",
"+38+007",
"+38+008",
"+38+009",
"+38+010",
"+38+011",
"+38+012",
"+38+013",
"+38+014",
"+38+015",
"+38+016",
"+38+017",
"+38+018",
"+38+019",
"+38+020",
"+38+021",
"+38+022",
"+38+023",
"+38+024",
"+38+025",
"+38+026",
"+38+027",
"+38+028",
"+38+029",
"+38+030",
"+38+031",
"+38+032",
"+38+033",
"+38+034",
"+38+035",
"+38+036",
"+38+037",
"+38+038",
"+38+039",
"+38+040",
"+38+041",
"+39-033",
"+39-032",
"+39-031",
"+39-030",
"+39-029",
"+39-028",
"+39-027",
"+39-026",
"+39-025",
"+39-024",
"+39-014",
"+39-013",
"+39-012",
"+39-011",
"+39-010",
"+39-009",
"+39-008",
"+39-007",
"+39-006",
"+39-005",
"+39-004",
"+39-003",
"+39-002",
"+39-001",
"+39+000",
"+39+001",
"+39+002",
"+39+003",
"+39+004",
"+39+005",
"+39+006",
"+39+007",
"+39+008",
"+39+009",
"+39+010",
"+39+011",
"+39+012",
"+39+013",
"+39+014",
"+39+015",
"+39+016",
"+39+017",
"+39+018",
"+39+019",
"+39+020",
"+39+021",
"+39+022",
"+39+023",
"+39+024",
"+39+025",
"+39+026",
"+39+027",
"+39+028",
"+39+029",
"+39+030",
"+39+031",
"+39+032",
"+39+033",
"+39+034",
"+39+035",
"+39+036",
"+39+037",
"+39+038",
"+39+039",
"+39+040",
"+39+041",
"+40-033",
"+40-032",
"+40-031",
"+40-030",
"+40-029",
"+40-028",
"+40-027",
"+40-026",
"+40-025",
"+40-024",
"+40-014",
"+40-013",
"+40-012",
"+40-011",
"+40-010",
"+40-009",
"+40-008",
"+40-007",
"+40-006",
"+40-005",
"+40-004",
"+40-003",
"+40-002",
"+40-001",
"+40+000",
"+40+001",
"+40+002",
"+40+003",
"+40+004",
"+40+005",
"+40+006",
"+40+007",
"+40+008",
"+40+009",
"+40+010",
"+40+011",
"+40+012",
"+40+013",
"+40+014",
"+40+015",
"+40+016",
"+40+017",
"+40+018",
"+40+019",
"+40+020",
"+40+021",
"+40+022",
"+40+023",
"+40+024",
"+40+025",
"+40+026",
"+40+027",
"+40+028",
"+40+029",
"+40+030",
"+40+031",
"+40+032",
"+40+033",
"+40+034",
"+40+035",
"+40+036",
"+40+037",
"+40+038",
"+40+039",
"+40+040",
"+41-014",
"+41-013",
"+41-012",
"+41-011",
"+41-010",
"+41-009",
"+41-008",
"+41-007",
"+41-006",
"+41-005",
"+41-004",
"+41-003",
"+41-002",
"+41-001",
"+41+000",
"+41+001",
"+41+002",
"+41+003",
"+41+004",
"+41+005",
"+41+006",
"+41+007",
"+41+008",
"+41+009",
"+41+010",
"+41+011",
"+41+012",
"+41+013",
"+41+014",
"+41+015",
"+41+016",
"+41+017",
"+41+018",
"+41+019",
"+41+020",
"+41+021",
"+41+022",
"+41+023",
"+41+024",
"+41+025",
"+41+026",
"+41+027",
"+41+028",
"+41+029",
"+41+030",
"+41+031",
"+41+032",
"+41+033",
"+41+034",
"+41+035",
"+41+036",
"+41+037",
"+41+038",
"+41+039",
"+42-014",
"+42-013",
"+42-012",
"+42-011",
"+42-010",
"+42-009",
"+42-008",
"+42-007",
"+42-006",
"+42-005",
"+42-004",
"+42-003",
"+42-002",
"+42-001",
"+42+000",
"+42+001",
"+42+002",
"+42+003",
"+42+004",
"+42+005",
"+42+006",
"+42+007",
"+42+008",
"+42+009",
"+42+010",
"+42+011",
"+42+012",
"+42+013",
"+42+014",
"+42+015",
"+42+016",
"+42+017",
"+42+018",
"+42+019",
"+42+020",
"+42+021",
"+42+022",
"+42+023",
"+42+024",
"+42+025",
"+42+026",
"+42+027",
"+42+028",
"+42+029",
"+42+030",
"+42+031",
"+42+032",
"+42+033",
"+42+034",
"+42+035",
"+42+036",
"+42+037",
"+42+038",
"+42+039",
"+43-014",
"+43-013",
"+43-012",
"+43-011",
"+43-010",
"+43-009",
"+43-008",
"+43-007",
"+43-006",
"+43-005",
"+43-004",
"+43-003",
"+43-002",
"+43-001",
"+43+000",
"+43+001",
"+43+002",
"+43+003",
"+43+004",
"+43+005",
"+43+006",
"+43+007",
"+43+008",
"+43+009",
"+43+010",
"+43+011",
"+43+012",
"+43+013",
"+43+014",
"+43+015",
"+43+016",
"+43+017",
"+43+018",
"+43+019",
"+43+020",
"+43+021",
"+43+022",
"+43+023",
"+43+024",
"+43+025",
"+43+026",
"+43+027",
"+43+028",
"+43+029",
"+43+030",
"+43+031",
"+43+032",
"+43+033",
"+43+034",
"+43+035",
"+43+036",
"+43+037",
"+43+038",
"+43+039",
"+44-014",
"+44-013",
"+44-012",
"+44-011",
"+44-010",
"+44-009",
"+44-008",
"+44-007",
"+44-006",
"+44-005",
"+44-004",
"+44-003",
"+44-002",
"+44-001",
"+44+000",
"+44+001",
"+44+002",
"+44+003",
"+44+004",
"+44+005",
"+44+006",
"+44+007",
"+44+008",
"+44+009",
"+44+010",
"+44+011",
"+44+012",
"+44+013",
"+44+014",
"+44+015",
"+44+016",
"+44+017",
"+44+018",
"+44+019",
"+44+020",
"+44+021",
"+44+022",
"+44+023",
"+44+024",
"+44+025",
"+44+026",
"+44+027",
"+44+028",
"+44+029",
"+44+030",
"+44+031",
"+44+032",
"+44+033",
"+44+034",
"+44+035",
"+44+036",
"+44+037",
"+44+038",
"+44+039",
"+45-014",
"+45-013",
"+45-012",
"+45-011",
"+45-010",
"+45-009",
"+45-008",
"+45-007",
"+45-006",
"+45-005",
"+45-004",
"+45-003",
"+45-002",
"+45-001",
"+45+000",
"+45+001",
"+45+002",
"+45+003",
"+45+004",
"+45+005",
"+45+006",
"+45+007",
"+45+008",
"+45+009",
"+45+010",
"+45+011",
"+45+012",
"+45+013",
"+45+014",
"+45+015",
"+45+016",
"+45+017",
"+45+018",
"+45+019",
"+45+020",
"+45+021",
"+45+022",
"+45+023",
"+45+024",
"+45+025",
"+45+026",
"+45+027",
"+45+028",
"+45+029",
"+45+030",
"+45+031",
"+45+032",
"+45+033",
"+45+034",
"+45+035",
"+45+036",
"+45+037",
"+45+038",
"+45+039",
"+46-014",
"+46-013",
"+46-012",
"+46-011",
"+46-010",
"+46-009",
"+46-008",
"+46-007",
"+46-006",
"+46-005",
"+46-004",
"+46-003",
"+46-002",
"+46-001",
"+46+000",
"+46+001",
"+46+002",
"+46+003",
"+46+004",
"+46+005",
"+46+006",
"+46+007",
"+46+008",
"+46+009",
"+46+010",
"+46+011",
"+46+012",
"+46+013",
"+46+014",
"+46+015",
"+46+016",
"+46+017",
"+46+018",
"+46+019",
"+46+020",
"+46+021",
"+46+022",
"+46+023",
"+46+024",
"+46+025",
"+46+026",
"+46+027",
"+46+028",
"+46+029",
"+46+030",
"+46+031",
"+46+032",
"+46+033",
"+46+034",
"+46+035",
"+46+036",
"+46+037",
"+46+038",
"+46+039",
"+46+040",
"+47-014",
"+47-013",
"+47-012",
"+47-011",
"+47-010",
"+47-009",
"+47-008",
"+47-007",
"+47-006",
"+47-005",
"+47-004",
"+47-003",
"+47-002",
"+47-001",
"+47+000",
"+47+001",
"+47+002",
"+47+003",
"+47+004",
"+47+005",
"+47+006",
"+47+007",
"+47+008",
"+47+009",
"+47+010",
"+47+011",
"+47+012",
"+47+013",
"+47+014",
"+47+015",
"+47+016",
"+47+017",
"+47+018",
"+47+019",
"+47+020",
"+47+021",
"+47+022",
"+47+023",
"+47+024",
"+47+025",
"+47+026",
"+47+027",
"+47+028",
"+47+029",
"+47+030",
"+47+031",
"+47+032",
"+47+033",
"+47+034",
"+47+035",
"+47+036",
"+47+037",
"+47+038",
"+47+039",
"+47+040",
"+47+041",
"+48-014",
"+48-013",
"+48-012",
"+48-011",
"+48-010",
"+48-009",
"+48-008",
"+48-007",
"+48-006",
"+48-005",
"+48-004",
"+48-003",
"+48-002",
"+48-001",
"+48+000",
"+48+001",
"+48+002",
"+48+003",
"+48+004",
"+48+005",
"+48+006",
"+48+007",
"+48+008",
"+48+009",
"+48+010",
"+48+011",
"+48+012",
"+48+013",
"+48+014",
"+48+015",
"+48+016",
"+48+017",
"+48+018",
"+48+019",
"+48+020",
"+48+021",
"+48+022",
"+48+023",
"+48+024",
"+48+025",
"+48+026",
"+48+027",
"+48+028",
"+48+029",
"+48+030",
"+48+031",
"+48+032",
"+48+033",
"+48+034",
"+48+035",
"+48+036",
"+48+037",
"+48+038",
"+48+039",
"+48+040",
"+48+041",
"+48+042",
"+49-014",
"+49-013",
"+49-012",
"+49-011",
"+49-010",
"+49-009",
"+49-008",
"+49-007",
"+49-006",
"+49-005",
"+49-004",
"+49-003",
"+49-002",
"+49-001",
"+49+000",
"+49+001",
"+49+002",
"+49+003",
"+49+004",
"+49+005",
"+49+006",
"+49+007",
"+49+008",
"+49+009",
"+49+010",
"+49+011",
"+49+012",
"+49+013",
"+49+014",
"+49+015",
"+49+016",
"+49+017",
"+49+018",
"+49+019",
"+49+020",
"+49+021",
"+49+022",
"+49+023",
"+49+024",
"+49+025",
"+49+026",
"+49+027",
"+49+028",
"+49+029",
"+49+030",
"+49+031",
"+49+032",
"+49+033",
"+49+034",
"+49+035",
"+49+036",
"+49+037",
"+49+038",
"+49+039",
"+49+040",
"+49+041",
"+49+042",
"+49+043",
"+49+044",
"+50-014",
"+50-013",
"+50-012",
"+50-011",
"+50-010",
"+50-009",
"+50-008",
"+50-007",
"+50-006",
"+50-005",
"+50-004",
"+50-003",
"+50-002",
"+50-001",
"+50+000",
"+50+001",
"+50+002",
"+50+003",
"+50+004",
"+50+005",
"+50+006",
"+50+007",
"+50+008",
"+50+009",
"+50+010",
"+50+011",
"+50+012",
"+50+013",
"+50+014",
"+50+015",
"+50+016",
"+50+017",
"+50+018",
"+50+019",
"+50+020",
"+50+021",
"+50+022",
"+50+023",
"+50+024",
"+50+025",
"+50+026",
"+50+027",
"+50+028",
"+50+029",
"+50+030",
"+50+031",
"+50+032",
"+50+033",
"+50+034",
"+50+035",
"+50+036",
"+50+037",
"+50+038",
"+50+039",
"+50+040",
"+50+041",
"+50+042",
"+50+043",
"+50+044",
"+50+045",
"+50+046",
"+50+047",
"+50+048",
"+50+049",
"+51-014",
"+51-013",
"+51-012",
"+51-011",
"+51-010",
"+51-009",
"+51-008",
"+51-007",
"+51-006",
"+51-005",
"+51-004",
"+51-003",
"+51-002",
"+51-001",
"+51+000",
"+51+001",
"+51+002",
"+51+003",
"+51+004",
"+51+005",
"+51+006",
"+51+007",
"+51+008",
"+51+009",
"+51+010",
"+51+011",
"+51+012",
"+51+013",
"+51+014",
"+51+015",
"+51+016",
"+51+017",
"+51+018",
"+51+019",
"+51+020",
"+51+021",
"+51+022",
"+51+023",
"+51+024",
"+51+025",
"+51+026",
"+51+027",
"+51+028",
"+51+029",
"+51+030",
"+51+031",
"+51+032",
"+51+033",
"+51+034",
"+51+035",
"+51+036",
"+51+037",
"+51+038",
"+51+039",
"+51+040",
"+51+041",
"+51+042",
"+51+043",
"+51+044",
"+51+045",
"+51+046",
"+51+047",
"+51+048",
"+51+049",
"+52-014",
"+52-013",
"+52-012",
"+52-011",
"+52-010",
"+52-009",
"+52-008",
"+52-007",
"+52-006",
"+52-005",
"+52-004",
"+52-003",
"+52-002",
"+52-001",
"+52+000",
"+52+001",
"+52+002",
"+52+003",
"+52+004",
"+52+005",
"+52+006",
"+52+007",
"+52+008",
"+52+009",
"+52+010",
"+52+011",
"+52+012",
"+52+013",
"+52+014",
"+52+015",
"+52+016",
"+52+017",
"+52+018",
"+52+019",
"+52+020",
"+52+021",
"+52+022",
"+52+023",
"+52+024",
"+52+025",
"+52+026",
"+52+027",
"+52+028",
"+52+029",
"+52+030",
"+52+031",
"+52+032",
"+52+033",
"+52+034",
"+52+035",
"+52+036",
"+52+037",
"+52+038",
"+52+039",
"+52+040",
"+52+041",
"+52+042",
"+52+043",
"+52+044",
"+52+045",
"+52+046",
"+52+047",
"+52+048",
"+52+049",
"+53-014",
"+53-013",
"+53-012",
"+53-011",
"+53-010",
"+53-009",
"+53-008",
"+53-007",
"+53-006",
"+53-005",
"+53-004",
"+53-003",
"+53-002",
"+53-001",
"+53+000",
"+53+001",
"+53+002",
"+53+003",
"+53+004",
"+53+005",
"+53+006",
"+53+007",
"+53+008",
"+53+009",
"+53+010",
"+53+011",
"+53+012",
"+53+013",
"+53+014",
"+53+015",
"+53+016",
"+53+017",
"+53+018",
"+53+019",
"+53+020",
"+53+021",
"+53+022",
"+53+023",
"+53+024",
"+53+025",
"+53+026",
"+53+027",
"+53+028",
"+53+029",
"+53+030",
"+53+031",
"+53+032",
"+53+033",
"+53+034",
"+53+035",
"+53+036",
"+53+037",
"+53+038",
"+53+039",
"+53+040",
"+53+041",
"+53+042",
"+53+043",
"+53+044",
"+53+045",
"+53+046",
"+53+047",
"+53+048",
"+53+049",
"+54-014",
"+54-013",
"+54-012",
"+54-011",
"+54-010",
"+54-009",
"+54-008",
"+54-007",
"+54-006",
"+54-005",
"+54-004",
"+54-003",
"+54-002",
"+54-001",
"+54+000",
"+54+001",
"+54+002",
"+54+003",
"+54+004",
"+54+005",
"+54+006",
"+54+007",
"+54+008",
"+54+009",
"+54+010",
"+54+011",
"+54+012",
"+54+013",
"+54+014",
"+54+015",
"+54+016",
"+54+017",
"+54+018",
"+54+019",
"+54+020",
"+54+021",
"+54+022",
"+54+023",
"+54+024",
"+54+025",
"+54+026",
"+54+027",
"+54+028",
"+54+029",
"+54+030",
"+54+031",
"+54+032",
"+54+033",
"+54+034",
"+54+035",
"+54+036",
"+54+037",
"+54+038",
"+54+039",
"+54+040",
"+54+041",
"+54+042",
"+54+043",
"+54+044",
"+54+045",
"+54+046",
"+54+047",
"+54+048",
"+54+049",
"+55-014",
"+55-013",
"+55-012",
"+55-011",
"+55-010",
"+55-009",
"+55-008",
"+55-007",
"+55-006",
"+55-005",
"+55-004",
"+55-003",
"+55-002",
"+55-001",
"+55+000",
"+55+001",
"+55+002",
"+55+003",
"+55+004",
"+55+005",
"+55+006",
"+55+007",
"+55+008",
"+55+009",
"+55+010",
"+55+011",
"+55+012",
"+55+013",
"+55+014",
"+55+015",
"+55+016",
"+55+017",
"+55+018",
"+55+019",
"+55+020",
"+55+021",
"+55+022",
"+55+023",
"+55+024",
"+55+025",
"+55+026",
"+55+027",
"+55+028",
"+55+029",
"+55+030",
"+55+031",
"+55+032",
"+55+033",
"+55+034",
"+55+035",
"+55+036",
"+55+037",
"+55+038",
"+55+039",
"+55+040",
"+55+041",
"+55+042",
"+55+043",
"+55+044",
"+55+045",
"+55+046",
"+55+047",
"+55+048",
"+55+049",
"+56-014",
"+56-013",
"+56-012",
"+56-011",
"+56-010",
"+56-009",
"+56-008",
"+56-007",
"+56-006",
"+56-005",
"+56-004",
"+56-003",
"+56-002",
"+56-001",
"+56+000",
"+56+001",
"+56+002",
"+56+003",
"+56+004",
"+56+005",
"+56+006",
"+56+007",
"+56+008",
"+56+009",
"+56+010",
"+56+011",
"+56+012",
"+56+013",
"+56+014",
"+56+015",
"+56+016",
"+56+017",
"+56+018",
"+56+019",
"+56+020",
"+56+021",
"+56+022",
"+56+023",
"+56+024",
"+56+025",
"+56+026",
"+56+027",
"+56+028",
"+56+029",
"+56+030",
"+56+031",
"+56+032",
"+56+033",
"+56+034",
"+56+035",
"+56+036",
"+56+037",
"+56+038",
"+56+039",
"+56+040",
"+56+041",
"+56+042",
"+56+043",
"+56+044",
"+56+045",
"+56+046",
"+56+047",
"+56+048",
"+56+049",
"+57-014",
"+57-013",
"+57-012",
"+57-011",
"+57-010",
"+57-009",
"+57-008",
"+57-007",
"+57-006",
"+57-005",
"+57-004",
"+57-003",
"+57-002",
"+57-001",
"+57+000",
"+57+001",
"+57+002",
"+57+003",
"+57+004",
"+57+005",
"+57+006",
"+57+007",
"+57+008",
"+57+009",
"+57+010",
"+57+011",
"+57+012",
"+57+013",
"+57+014",
"+57+015",
"+57+016",
"+57+017",
"+57+018",
"+57+019",
"+57+020",
"+57+021",
"+57+022",
"+57+023",
"+57+024",
"+57+025",
"+57+026",
"+57+027",
"+57+028",
"+57+029",
"+57+030",
"+57+031",
"+57+032",
"+57+033",
"+57+034",
"+57+035",
"+57+036",
"+57+037",
"+57+038",
"+57+039",
"+57+040",
"+57+041",
"+57+042",
"+57+043",
"+57+044",
"+57+045",
"+57+046",
"+57+047",
"+57+048",
"+57+049",
"+58-014",
"+58-013",
"+58-012",
"+58-011",
"+58-010",
"+58-009",
"+58-008",
"+58-007",
"+58-006",
"+58-005",
"+58-004",
"+58-003",
"+58-002",
"+58-001",
"+58+000",
"+58+001",
"+58+002",
"+58+003",
"+58+004",
"+58+005",
"+58+006",
"+58+007",
"+58+008",
"+58+009",
"+58+010",
"+58+011",
"+58+012",
"+58+013",
"+58+014",
"+58+015",
"+58+016",
"+58+017",
"+58+018",
"+58+019",
"+58+020",
"+58+021",
"+58+022",
"+58+023",
"+58+024",
"+58+025",
"+58+026",
"+58+027",
"+58+028",
"+58+029",
"+58+030",
"+58+031",
"+58+032",
"+58+033",
"+58+034",
"+58+035",
"+58+036",
"+58+037",
"+58+038",
"+58+039",
"+58+040",
"+58+041",
"+58+042",
"+58+043",
"+58+044",
"+58+045",
"+58+046",
"+58+047",
"+58+048",
"+58+049",
"+59-014",
"+59-013",
"+59-012",
"+59-011",
"+59-010",
"+59-009",
"+59-008",
"+59-007",
"+59-006",
"+59-005",
"+59-004",
"+59-003",
"+59-002",
"+59-001",
"+59+000",
"+59+001",
"+59+002",
"+59+003",
"+59+004",
"+59+005",
"+59+006",
"+59+007",
"+59+008",
"+59+009",
"+59+010",
"+59+011",
"+59+012",
"+59+013",
"+59+014",
"+59+015",
"+59+016",
"+59+017",
"+59+018",
"+59+019",
"+59+020",
"+59+021",
"+59+022",
"+59+023",
"+59+024",
"+59+025",
"+59+026",
"+59+027",
"+59+028",
"+59+029",
"+59+030",
"+59+031",
"+59+032",
"+59+033",
"+59+034",
"+59+035",
"+59+036",
"+59+037",
"+59+038",
"+59+039",
"+59+040",
"+59+041",
"+59+042",
"+59+043",
"+59+044",
"+59+045",
"+59+046",
"+59+047",
"+59+048",
"+59+049",
"+60-020",
"+60-019",
"+60-018",
"+60-017",
"+60-016",
"+60-015",
"+60-014",
"+60-013",
"+60-012",
"+60-011",
"+60-010",
"+60-009",
"+60-008",
"+60-007",
"+60-006",
"+60-005",
"+60-004",
"+60-003",
"+60-002",
"+60-001",
"+60+000",
"+60+001",
"+60+002",
"+60+003",
"+60+004",
"+60+005",
"+60+006",
"+60+007",
"+60+008",
"+60+009",
"+60+010",
"+60+011",
"+60+012",
"+60+013",
"+60+014",
"+60+015",
"+60+016",
"+60+017",
"+60+018",
"+60+019",
"+60+020",
"+60+021",
"+60+022",
"+60+023",
"+60+024",
"+60+025",
"+60+026",
"+60+027",
"+60+028",
"+60+029",
"+60+030",
"+60+031",
"+60+032",
"+60+033",
"+60+034",
"+60+035",
"+60+036",
"+60+037",
"+60+038",
"+60+039",
"+60+040",
"+60+041",
"+60+042",
"+60+043",
"+60+044",
"+60+045",
"+60+046",
"+60+047",
"+60+048",
"+60+049",
"+61-021",
"+61-020",
"+61-019",
"+61-018",
"+61-017",
"+61-016",
"+61-015",
"+61-014",
"+61-013",
"+61-012",
"+61-011",
"+61-010",
"+61-009",
"+61-008",
"+61-007",
"+61-006",
"+61-005",
"+61-004",
"+61-003",
"+61-002",
"+61-001",
"+61+000",
"+61+001",
"+61+002",
"+61+003",
"+61+004",
"+61+005",
"+61+006",
"+61+007",
"+61+008",
"+61+009",
"+61+010",
"+61+011",
"+61+012",
"+61+013",
"+61+014",
"+61+015",
"+61+016",
"+61+017",
"+61+018",
"+61+019",
"+61+020",
"+61+021",
"+61+022",
"+61+023",
"+61+024",
"+61+025",
"+61+026",
"+61+027",
"+61+028",
"+61+029",
"+61+030",
"+61+031",
"+61+032",
"+61+033",
"+61+034",
"+61+035",
"+61+036",
"+61+037",
"+61+038",
"+61+039",
"+61+040",
"+61+041",
"+61+042",
"+61+043",
"+61+044",
"+61+045",
"+61+046",
"+61+047",
"+61+048",
"+61+049",
"+62-022",
"+62-021",
"+62-020",
"+62-019",
"+62-018",
"+62-017",
"+62-016",
"+62-015",
"+62-014",
"+62-013",
"+62-012",
"+62-011",
"+62-010",
"+62-009",
"+62-008",
"+62-007",
"+62-006",
"+62-005",
"+62-004",
"+62-003",
"+62-002",
"+62-001",
"+62+000",
"+62+001",
"+62+002",
"+62+003",
"+62+004",
"+62+005",
"+62+006",
"+62+007",
"+62+008",
"+62+009",
"+62+010",
"+62+011",
"+62+012",
"+62+013",
"+62+014",
"+62+015",
"+62+016",
"+62+017",
"+62+018",
"+62+019",
"+62+020",
"+62+021",
"+62+022",
"+62+023",
"+62+024",
"+62+025",
"+62+026",
"+62+027",
"+62+028",
"+62+029",
"+62+030",
"+62+031",
"+62+032",
"+62+033",
"+62+034",
"+62+035",
"+62+036",
"+62+037",
"+62+038",
"+62+039",
"+62+040",
"+62+041",
"+62+042",
"+62+043",
"+62+044",
"+62+045",
"+62+046",
"+62+047",
"+62+048",
"+62+049",
"+63-023",
"+63-022",
"+63-021",
"+63-020",
"+63-019",
"+63-018",
"+63-017",
"+63-016",
"+63-015",
"+63-014",
"+63-013",
"+63-012",
"+63-011",
"+63-010",
"+63-009",
"+63-008",
"+63-007",
"+63-006",
"+63-005",
"+63-004",
"+63-003",
"+63-002",
"+63-001",
"+63+000",
"+63+001",
"+63+002",
"+63+003",
"+63+004",
"+63+005",
"+63+006",
"+63+007",
"+63+008",
"+63+009",
"+63+010",
"+63+011",
"+63+012",
"+63+013",
"+63+014",
"+63+015",
"+63+016",
"+63+017",
"+63+018",
"+63+019",
"+63+020",
"+63+021",
"+63+022",
"+63+023",
"+63+024",
"+63+025",
"+63+026",
"+63+027",
"+63+028",
"+63+029",
"+63+030",
"+63+031",
"+63+032",
"+63+033",
"+63+034",
"+63+035",
"+63+036",
"+63+037",
"+63+038",
"+63+039",
"+63+040",
"+63+041",
"+63+042",
"+63+043",
"+63+044",
"+63+045",
"+63+046",
"+63+047",
"+63+048",
"+63+049",
"+64-024",
"+64-023",
"+64-022",
"+64-021",
"+64-020",
"+64-019",
"+64-018",
"+64-017",
"+64-016",
"+64-015",
"+64-014",
"+64-013",
"+64-012",
"+64-011",
"+64-010",
"+64-009",
"+64-008",
"+64-007",
"+64-006",
"+64-005",
"+64-004",
"+64-003",
"+64-002",
"+64-001",
"+64+000",
"+64+001",
"+64+002",
"+64+003",
"+64+004",
"+64+005",
"+64+006",
"+64+007",
"+64+008",
"+64+009",
"+64+010",
"+64+011",
"+64+012",
"+64+013",
"+64+014",
"+64+015",
"+64+016",
"+64+017",
"+64+018",
"+64+019",
"+64+020",
"+64+021",
"+64+022",
"+64+023",
"+64+024",
"+64+025",
"+64+026",
"+64+027",
"+64+028",
"+64+029",
"+64+030",
"+64+031",
"+64+032",
"+64+033",
"+64+034",
"+64+035",
"+64+036",
"+64+037",
"+64+038",
"+64+039",
"+64+040",
"+64+041",
"+64+042",
"+64+043",
"+64+044",
"+64+045",
"+64+046",
"+64+047",
"+64+048",
"+64+049",
"+65-025",
"+65-024",
"+65-023",
"+65-022",
"+65-021",
"+65-020",
"+65-019",
"+65-018",
"+65-017",
"+65-016",
"+65-015",
"+65-014",
"+65-013",
"+65-012",
"+65-011",
"+65-010",
"+65-009",
"+65-008",
"+65-007",
"+65-006",
"+65-005",
"+65-004",
"+65-003",
"+65-002",
"+65-001",
"+65+000",
"+65+001",
"+65+002",
"+65+003",
"+65+004",
"+65+005",
"+65+006",
"+65+007",
"+65+008",
"+65+009",
"+65+010",
"+65+011",
"+65+012",
"+65+013",
"+65+014",
"+65+015",
"+65+016",
"+65+017",
"+65+018",
"+65+019",
"+65+020",
"+65+021",
"+65+022",
"+65+023",
"+65+024",
"+65+025",
"+65+026",
"+65+027",
"+65+028",
"+65+029",
"+65+030",
"+65+031",
"+65+032",
"+65+033",
"+65+034",
"+65+035",
"+65+036",
"+65+037",
"+65+038",
"+65+039",
"+65+040",
"+65+041",
"+65+042",
"+65+043",
"+65+044",
"+65+045",
"+65+046",
"+65+047",
"+65+048",
"+65+049",
"+66-025",
"+66-024",
"+66-023",
"+66-022",
"+66-021",
"+66-020",
"+66-019",
"+66-018",
"+66-017",
"+66-016",
"+66-015",
"+66-014",
"+66-013",
"+66-012",
"+66-011",
"+66-010",
"+66-009",
"+66-008",
"+66-007",
"+66-006",
"+66-005",
"+66-004",
"+66-003",
"+66-002",
"+66-001",
"+66+000",
"+66+001",
"+66+002",
"+66+003",
"+66+004",
"+66+005",
"+66+006",
"+66+007",
"+66+008",
"+66+009",
"+66+010",
"+66+011",
"+66+012",
"+66+013",
"+66+014",
"+66+015",
"+66+016",
"+66+017",
"+66+018",
"+66+019",
"+66+020",
"+66+021",
"+66+022",
"+66+023",
"+66+024",
"+66+025",
"+66+026",
"+66+027",
"+66+028",
"+66+029",
"+66+030",
"+66+031",
"+66+032",
"+66+033",
"+66+034",
"+66+035",
"+66+036",
"+66+037",
"+66+038",
"+66+039",
"+66+040",
"+66+041",
"+66+042",
"+66+043",
"+66+044",
"+66+045",
"+66+046",
"+66+047",
"+66+048",
"+66+049",
"+67-026",
"+67-025",
"+67-024",
"+67-023",
"+67-022",
"+67-021",
"+67-020",
"+67-019",
"+67-018",
"+67-017",
"+67-016",
"+67-015",
"+67-014",
"+67-013",
"+67-012",
"+67-011",
"+67-010",
"+67-009",
"+67-008",
"+67-007",
"+67-006",
"+67-005",
"+67-004",
"+67-003",
"+67-002",
"+67-001",
"+67+000",
"+67+001",
"+67+002",
"+67+003",
"+67+004",
"+67+005",
"+67+006",
"+67+007",
"+67+008",
"+67+009",
"+67+010",
"+67+011",
"+67+012",
"+67+013",
"+67+014",
"+67+015",
"+67+016",
"+67+017",
"+67+018",
"+67+019",
"+67+020",
"+67+021",
"+67+022",
"+67+023",
"+67+024",
"+67+025",
"+67+026",
"+67+027",
"+67+028",
"+67+029",
"+67+030",
"+67+031",
"+67+032",
"+67+033",
"+67+034",
"+67+035",
"+67+036",
"+67+037",
"+67+038",
"+67+039",
"+67+040",
"+67+041",
"+67+042",
"+67+043",
"+67+044",
"+67+045",
"+67+046",
"+67+047",
"+67+048",
"+67+049",
"+68-023",
"+68-022",
"+68-021",
"+68-020",
"+68-019",
"+68-018",
"+68-017",
"+68-016",
"+68-015",
"+68-014",
"+68-013",
"+68-012",
"+68-011",
"+68-010",
"+68-009",
"+68-008",
"+68-007",
"+68-006",
"+68-005",
"+68-004",
"+68-003",
"+68-002",
"+68-001",
"+68+000",
"+68+001",
"+68+002",
"+68+003",
"+68+004",
"+68+005",
"+68+006",
"+68+007",
"+68+008",
"+68+009",
"+68+010",
"+68+011",
"+68+012",
"+68+013",
"+68+014",
"+68+015",
"+68+016",
"+68+017",
"+68+018",
"+68+019",
"+68+020",
"+68+021",
"+68+022",
"+68+023",
"+68+024",
"+68+025",
"+68+026",
"+68+027",
"+68+028",
"+68+029",
"+68+030",
"+68+031",
"+68+032",
"+68+033",
"+68+034",
"+68+035",
"+68+036",
"+68+037",
"+68+038",
"+68+039",
"+68+040",
"+68+041",
"+68+042",
"+68+043",
"+68+044",
"+68+045",
"+68+046",
"+68+047",
"+68+048",
"+68+049",
"+69-020",
"+69-019",
"+69-018",
"+69-017",
"+69-016",
"+69-015",
"+69-014",
"+69-013",
"+69-012",
"+69-011",
"+69-010",
"+69-009",
"+69-008",
"+69-007",
"+69-006",
"+69-005",
"+69-004",
"+69-003",
"+69-002",
"+69-001",
"+69+000",
"+69+001",
"+69+002",
"+69+003",
"+69+004",
"+69+005",
"+69+006",
"+69+007",
"+69+008",
"+69+009",
"+69+010",
"+69+011",
"+69+012",
"+69+013",
"+69+014",
"+69+015",
"+69+016",
"+69+017",
"+69+018",
"+69+019",
"+69+020",
"+69+021",
"+69+022",
"+69+023",
"+69+024",
"+69+025",
"+69+026",
"+69+027",
"+69+028",
"+69+029",
"+69+030",
"+69+031",
"+69+032",
"+69+033",
"+69+034",
"+69+035",
"+69+036",
"+69+037",
"+69+038",
"+69+039",
"+69+040",
"+69+041",
"+69+042",
"+69+043",
"+69+044",
"+69+045",
"+69+046",
"+69+047",
"+69+048",
"+69+049",
"+70-010",
"+70-009",
"+70-008",
"+70-007",
"+70-006",
"+70-005",
"+70-004",
"+70-003",
"+70-002",
"+70-001",
"+70+000",
"+70+001",
"+70+002",
"+70+003",
"+70+004",
"+70+005",
"+70+006",
"+70+007",
"+70+008",
"+70+009",
"+70+010",
"+70+011",
"+70+012",
"+70+013",
"+70+014",
"+70+015",
"+70+016",
"+70+017",
"+70+018",
"+70+019",
"+70+020",
"+70+021",
"+70+022",
"+70+023",
"+70+024",
"+70+025",
"+70+026",
"+70+027",
"+70+028",
"+70+029",
"+70+030",
"+70+031",
"+70+032",
"+70+033",
"+70+034",
"+70+035",
"+70+036",
"+70+037",
"+70+038",
"+70+039",
"+70+040",
"+70+041",
"+70+042",
"+70+043",
"+70+044",
"+70+045",
"+70+046",
"+70+047",
"+70+048",
"+70+049",
"+71-010",
"+71-009",
"+71-008",
"+71-007",
"+71-006",
"+71-005",
"+71-004",
"+71-003",
"+71-002",
"+71-001",
"+71+000",
"+71+001",
"+71+002",
"+71+003",
"+71+004",
"+71+005",
"+71+006",
"+71+007",
"+71+008",
"+71+009",
"+71+010",
"+71+011",
"+71+012",
"+71+013",
"+71+014",
"+71+015",
"+71+016",
"+71+017",
"+71+018",
"+71+019",
"+71+020",
"+71+021",
"+71+022",
"+71+023",
"+71+024",
"+71+025",
"+71+026",
"+71+027",
"+71+028",
"+71+029",
"+71+030",
"+71+031",
"+71+032",
"+71+033",
"+71+034",
"+71+035",
"+71+036",
"+71+037",
"+71+038",
"+71+039",
"+71+040",
"+71+041",
"+71+042",
"+71+043",
"+71+044",
"+71+045",
"+71+046",
"+71+047",
"+71+048",
"+71+049",
"+72-010",
"+72-009",
"+72-008",
"+72-007",
"+72-006",
"+72-005",
"+72-004",
"+72-003",
"+72-002",
"+72-001",
"+72+000",
"+72+001",
"+72+002",
"+72+003",
"+72+004",
"+72+005",
"+72+006",
"+72+007",
"+72+008",
"+72+009",
"+72+010",
"+72+011",
"+72+012",
"+72+013",
"+72+014",
"+72+015",
"+72+016",
"+72+017",
"+72+018",
"+72+019",
"+72+020",
"+72+021",
"+72+022",
"+72+023",
"+72+024",
"+72+025",
"+72+026",
"+72+027",
"+72+028",
"+72+029",
"+72+030",
"+72+031",
"+72+032",
"+72+033",
"+72+034",
"+72+035",
"+72+036",
"+72+037",
"+72+038",
"+72+039",
"+72+040",
"+72+041",
"+72+042",
"+72+043",
"+72+044",
"+72+045",
"+72+046",
"+72+047",
"+72+048",
"+72+049",
NULL
};

static bool is_eu(const char * tile)
{
	int n = 0;
	while(eu_latlon[n])
	{
		if(strcmp(tile,eu_latlon[n]) == 0)
			return true;
		++n;
	}
	return false;
}


static int DoInitWithRegion(const vector<const char *>& args)
{
	if(is_eu(args[0]))
		gRegion = rf_eu;
	else
		gRegion = rf_usa;
	
	XESInit(true);
	return 0;
}

static	GISTool_RegCmd_t		sCoreCmds[] = {
{ "-region",		1, 1, DoInitWithRegion,	"Init RF to a particular set of region presets.", "" },
{ "-crop", 			0, 0, DoCrop, 			"Crop the map and DEMs to the current extent.", "" },
{ "-cropgrid",		0, 0, DoCropGrid, 		"Crop the map along 1x1 degree grid lines.", "" },
{ "-bbox", 			0, 0, DoBbox, 			"Show bounds of all maps.", "" },
//{ "-nearest_dist",  0, 0, DoNearest, 		"Returns closest two pts on map.", "" },
{ "-water_count",	0, 0, DoWaterCount,		"Count amount of water in file.", "" },
{ "-extent", 		4, 4, DoExtent, 		"Set the bounds for further crop and import commands.", "" },
{ "-validate", 		0, 0, DoValidate, 		"Test vector map integrity.", "" },
{ "-load", 			1, 1, DoLoad, 			"Load an XES file.", "" },
{ "-save", 			1, 1, DoSave, 			"Save an XES file.", "" },
{ "-force_save", 	1, 1, DoSaveForce,		"Save an XES file, even if empty.", "" },
{ "-ifempty",		1, 2, DoIfEmpty,		"Skip the next N commands unless the map or a layer is empty.", "" },
{ "-cropsave", 		1, 1, DoCropSave, 		"Save only extent as an XES file.", "" },
{ "-overlay", 		1, 1, DoOverlay, 		"Superimpose/replace a second vector map.", "" },
{ "-merge", 		1, 1, DoMerge,			"Superimpose/merge a second vector map.", "" },
{ "-simplify",		0, 0, DoSimplify,		"Remove unneeded vectors.", "" },
{ "-tag_origin",	1, 1, DoTagOrigin,		"Apply origin code X to this map.", "" },

{ 0, 0, 0, 0, 0, 0 }
};

void	RegisterCoreCmds(void)
{
	GISTool_RegisterCommands(sCoreCmds);
}

